/** 【文件说明】：存储管理类，封装了 localStorage 和 sessionStorage 的操作。
 *  【使用例子】：
 
    storageManager.setItem('userData', { name: 'John Doe', age: 30 });
    storageManager.setSessionItem('sessionData', { name: 'Jane Doe', age: 25 });

    const userData = storageManager.getItem<{ name: string; age: number }>('userData');
    const sessionData = storageManager.getSessionItem<{ name: string; age: number }>('sessionData');

    storageManager.clear();
    storageManager.clearSession();
 */
class StorageManager {
    /**
     * 设置本地存储中的键值对。
     * @param key - 存储的键名。
     * @param value - 存储的值，可以是任何 JSON 可序列化的类型。
     */
    setItem(key: string, value: any): void {
      try {
        const stringValue = JSON.stringify(value);
        localStorage.setItem(key, stringValue);
      } catch (error) {
        console.error('Error setting item in localStorage:', error);
      }
    }
  
    /**
     * 获取本地存储中的值。
     * @param key - 存储的键名。
     * @returns 返回与键关联的值，如果键不存在则返回 null。
     */
    getItem<T = any>(key: string): T | null {
      try {
        const stringValue = localStorage.getItem(key);
        if (stringValue === null) {
          return null;
        }
        return JSON.parse(stringValue) as T;
      } catch (error) {
        console.error('Error getting item from localStorage:', error);
        return null;
      }
    }
  
    /**
     * 从本地存储中移除指定键的值。
     * @param key - 要移除的键名。
     */
    removeItem(key: string): void {
      try {
        localStorage.removeItem(key);
      } catch (error) {
        console.error('Error removing item from localStorage:', error);
      }
    }
  
    /**
     * 清空本地存储。
     */
    clear(): void {
      try {
        localStorage.clear();
      } catch (error) {
        console.error('Error clearing localStorage:', error);
      }
    }
  
    /**
     * 设置会话存储中的键值对。
     * @param key - 存储的键名。
     * @param value - 存储的值，可以是任何 JSON 可序列化的类型。
     */
    setSessionItem(key: string, value: any): void {
      try {
        const stringValue = JSON.stringify(value);
        sessionStorage.setItem(key, stringValue);
      } catch (error) {
        console.error('Error setting item in sessionStorage:', error);
      }
    }
  
    /**
     * 获取会话存储中的值。
     * @param key - 存储的键名。
     * @returns 返回与键关联的值，如果键不存在则返回 null。
     */
    getSessionItem<T = any>(key: string): T | null {
      try {
        const stringValue = sessionStorage.getItem(key);
        if (stringValue === null) {
          return null;
        }
        return JSON.parse(stringValue) as T;
      } catch (error) {
        console.error('Error getting item from sessionStorage:', error);
        return null;
      }
    }
  
    /**
     * 从会话存储中移除指定键的值。
     * @param key - 要移除的键名。
     */
    removeSessionItem(key: string): void {
      try {
        sessionStorage.removeItem(key);
      } catch (error) {
        console.error('Error removing item from sessionStorage:', error);
      }
    }
  
    /**
     * 清空会话存储。
     */
    clearSession(): void {
      try {
        sessionStorage.clear();
      } catch (error) {
        console.error('Error clearing sessionStorage:', error);
      }
    }
  }
  
  // 导出单例实例
  const storageManager = new StorageManager();
  export default storageManager;